package com.ld.ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener, ActionListener {
    //GameJFrame表示游戏的主界面
    //以后跟游戏有关的所有逻辑都写在这个类里

    //创建一个二维数组
    //目的；用来管理数据
    //加载图片会根据二维数组顺序加载
    int[][] date=new int[4][4];
    //记录空白方块在二维数组的位置
    int x=0,y=0;

    //定义一个正确的二维数组，拼图二维数组判断是否相同
    int[][] win=new int[][]{
        {1, 5, 9, 13},
        {2, 6, 10, 14},
        {3, 7, 11, 15},
        {4, 8, 12, 16},
    };

    //定义一个计数器，表示统计步数
    int step=0;

    //定义一个变量，记录当前展示的托片的路径、
    String path ="puzzlegame\\image\\girl\\girl"+"11\\";

    //3.创建选项下面的条目对象
    JMenuItem replayItem = new JMenuItem("重新游戏");
    JMenuItem reloginItem = new JMenuItem("重新登录");
    JMenuItem closeItem = new JMenuItem("关闭游戏");

    JMenuItem accountItem = new JMenuItem("公众号");

    JMenuItem rechargeItem1 = new JMenuItem("打赏一元钱");
    JMenuItem rechargeItem2 = new JMenuItem("打赏六元钱");
    JMenuItem rechargeItem3 = new JMenuItem("打赏三十元钱");
    JMenuItem rechargeItem4 = new JMenuItem("打赏九十八元钱");
    JMenuItem rechargeItem5 = new JMenuItem("打赏六百四十八元钱");

    JMenuItem beautyItem = new JMenuItem("美女");
    JMenuItem animalItem = new JMenuItem("动物");
    JMenuItem sportItem = new JMenuItem("运动");




    //构造方法（初始化）
    public GameJFrame(){
        //在创建登录界面的时候，同时给这个界面设置一些信息

        //初始化界面
        initJFrame();

        //初始化菜单
        initJMenuBar();
        
        //初始化数据(打乱图片顺序)
        initDate();

        //初始化图片，就是加载图片
        initImage();


        //让界面显示出来，建议写在最后
        this.setVisible(true);
    }

    private void initDate() {
        //把数组0-15打乱顺序，再添加4*4的二维数组中
        int[] tempArr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        Random r=new Random();
        for (int i = 0; i < tempArr.length; i++) {
            int randomIndex=r.nextInt(tempArr.length);

            int temp=tempArr[i];
            tempArr[i]=tempArr[randomIndex];
            tempArr[randomIndex]=temp;
        }
//        for (int i = 0; i < tempArr.length; i++) {
//            System.out.print(tempArr[i]+" ");
//        }
//        System.out.println();

        for (int i = 0; i < tempArr.length; i++) {
            if (tempArr[i]==0){
                x=i/4;
                y=i%4;
            }
            date[i/4][i%4]=tempArr[i];
        }
//        for (int i = 0; i < date.length; i++) {
//            for (int j = 0; j < date[i].length; j++) {
//                System.out.print(date[i][j]+" ");
//            }
//            System.out.println();
//        }
    }

    private void initImage() {

        //将拼图更新成操作后新数组的形式
        //删除当前图片
        this.getContentPane().removeAll();

        if (victory()){
            //两个图片相同则显示胜利图标
            JLabel winJLabel =new JLabel(new ImageIcon("puzzlegame\\image\\win.png"));
            winJLabel.setBounds(203,283,197,73);
            this.getContentPane().add(winJLabel);
        }

        JLabel stepCount=new JLabel("步数："+step);
        stepCount.setBounds(50,30,100,20);
        this.getContentPane().add(stepCount);

        for (int j = 0; j < 4; j++) {
            for (int i = 0; i < 4; i++) {

                //创建一个图片ImageIcon的对象
                ImageIcon icon=new ImageIcon(path+date[i][j]+".jpg");

                //创建一个JLabel的对象（管理容器）
                JLabel jLabel = new JLabel(icon);

                //指定图片位置
                jLabel.setBounds(105*i+83,105*j+134,105,105);

                //给图片添加边框，0是凸边框，1是凹边框
                jLabel.setBorder(new BevelBorder(1));

                //把管理容器添加到界面中
                //this.add(jLabel);
                this.getContentPane().add(jLabel);

                //添加一次图片number就自增一次，表示添加下一个图片

            }
        }

        //添加背景图片
        JLabel background = new JLabel(new ImageIcon("puzzlegame\\image\\background.png"));
        //指定背景图片位置
        background.setBounds(40,40,508,560);
        //把背景图片放置到游戏界面中
        this.getContentPane().add(background);

        //刷新一下
        this.getContentPane().repaint();
    }

    private void initJMenuBar() {
        //1.创建整个菜单对象
        JMenuBar jMenuBar = new JMenuBar();

        //2.创建菜单上的两个选项对象 功能 关于我们
        JMenu functionJMenu = new JMenu("功能");
        JMenu aboutJMenu = new JMenu("关于我们");
        JMenu rechargeJMenu = new JMenu("充值入口");
        JMenu reImageJMenu = new JMenu("更换图片");

//        //3.创建选项下面的条目对象
//        JMenuItem replayItem = new JMenuItem("重新游戏");
//        JMenuItem reloginItem = new JMenuItem("重新登录");
//        JMenuItem closeItem = new JMenuItem("关闭游戏");
//
//        JMenuItem accountItem = new JMenuItem("公众号");
//
//        JMenuItem rechargeItem1 = new JMenuItem("打赏一元钱");
//        JMenuItem rechargeItem2 = new JMenuItem("打赏六元钱");
//        JMenuItem rechargeItem3 = new JMenuItem("打赏三十元钱");
//        JMenuItem rechargeItem4 = new JMenuItem("打赏九十八元钱");
//        JMenuItem rechargeItem5 = new JMenuItem("打赏六百四十八元钱");
//
//        JMenuItem beautyItem = new JMenuItem("美女");
//        JMenuItem animalItem = new JMenuItem("动物");
//        JMenuItem sportItem = new JMenuItem("运动");

        //将每一个选项下面的条目添加到选项当中
        functionJMenu.add(reImageJMenu);
        functionJMenu.add(replayItem);
        functionJMenu.add(reloginItem);
        functionJMenu.add(closeItem);


        aboutJMenu.add(accountItem);

        rechargeJMenu.add(rechargeItem1);
        rechargeJMenu.add(rechargeItem2);
        rechargeJMenu.add(rechargeItem3);
        rechargeJMenu.add(rechargeItem4);
        rechargeJMenu.add(rechargeItem5);

        reImageJMenu.add(beautyItem);
        reImageJMenu.add(animalItem);
        reImageJMenu.add(sportItem);




        //给每个条目绑定事件
        replayItem.addActionListener(this);
        reloginItem.addActionListener(this);
        closeItem.addActionListener(this);
        accountItem.addActionListener(this);
        rechargeItem1.addActionListener(this);
        rechargeItem2.addActionListener(this);
        rechargeItem3.addActionListener(this);
        rechargeItem4.addActionListener(this);
        rechargeItem5.addActionListener(this);
        beautyItem.addActionListener(this);
        animalItem.addActionListener(this);
        sportItem.addActionListener(this);

        //将菜单的两个选项添加到菜单当中
        jMenuBar.add(functionJMenu);
        jMenuBar.add(aboutJMenu);
        jMenuBar.add(rechargeJMenu);

        //给游戏界面设计菜单
        this.setJMenuBar(jMenuBar);
    }

    private void initJFrame() {
        //属性：宽，高
        this.setSize(603,680);

        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");

        //设置界面置顶
        this.setAlwaysOnTop(true);

        //设置界面居中
        this.setLocationRelativeTo(null);

        //设置游戏的关闭模式
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        //取消默认的居中放置，之后才能按照xy轴的形式添加组件
        this.setLayout(null);

        //给整个页面添加键盘监听事件
        this.addKeyListener(this);
    }

    //判断当前二维数组与正确的二维数组是否相同
    public boolean victory(){
        boolean flag =true;
        for (int i = 0; i < date.length; i++) {
            for (int j = 0; j < date[i].length; j++) {
                if (date[i][j]!=win[i][j]){
                    flag=false;
                    break;
                }
            }
        }
        return flag;
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    //按下不松时会调用这个方法
    @Override
    public void keyPressed(KeyEvent e) {

        //判断是否胜利，胜利之后不能调用此方法,即不能查看完整图片
        if (victory()){
            return;
        }

        int code =e.getKeyCode();
        if (code==10){
            //清空当前拼图图片
            this.getContentPane().removeAll();

            //展示完整图片
            JLabel allImage = new JLabel(new ImageIcon(path+"all.jpg"));
            allImage.setBounds(83,134,420,420);
            this.getContentPane().add(allImage);

            //添加背景图片
            JLabel background = new JLabel(new ImageIcon("puzzlegame\\image\\background.png"));
            //指定背景图片位置
            background.setBounds(40,40,508,560);
            //把背景图片放置到游戏界面中
            this.getContentPane().add(background);

            //刷新一下
            this.getContentPane().repaint();

        }
    }

    //按键松开时会调用这个方法
    @Override
    public void keyReleased(KeyEvent e) {

        //判断是否胜利，胜利之后不能调用此方法,即不能移动拼图
        if (victory()){
            return;
        }

        //对上下左右进行判断
        //  分别是左37 上38 右39 下40
        int code =e.getKeyCode();
        System.out.println(code);
        if (code==37){
            System.out.println("向左移动");
            if (x==3){
                return;
            }
            date[x][y]=date[x+1][y];
            date[x+1][y]=0;
            x++;
            //每移动一次，步数计数器加一
            step++;
            initImage();
        } else if (code==38) {
            System.out.println("向上移动");
            if (y==3){
                return;
            }
            date[x][y]=date[x][y+1];
            date[x][y+1]=0;
            y++;
            //每移动一次，步数计数器加一
            step++;
            initImage();

        } else if (code==39) {
            System.out.println("向右移动");
            if (x==0){
                return;
            }
            date[x][y]=date[x-1][y];
            date[x-1][y]=0;
            x--;
            //每移动一次，步数计数器加一
            step++;
            initImage();
        } else if (code==40) {
            System.out.println("向下移动");
            if (y==0){
                return;
            }
            date[x][y]=date[x][y-1];
            date[x][y-1]=0;
            y--;
            //每移动一次，步数计数器加一
            step++;
            initImage();
        } else if (code==10) {
            initImage();
        }else if (code==16) {
            date=new int[][]{
                    {1, 5, 9, 13},
                    {2, 6, 10, 14},
                    {3, 7, 11, 15},
                    {4, 8, 12, 16},
            };
            initImage();
        }

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //获取单击选择的条目
        Object obj = e.getSource();
        if (obj==replayItem){
            System.out.println("重新游戏");
            initDate();
            step=0;
            initImage();
        } else if (obj==reloginItem) {
            System.out.println("重新登录");
            //关闭当前的游戏界面
            this.setVisible(false);
//            this.dispose(); 关闭页面
            //打开登录界面
            new LoginJFrame();
        } else if (obj==closeItem) {
            System.out.println("关闭游戏");
            //直接关闭虚拟机即可
            System.exit(0);
        } else if (obj==accountItem) {
            System.out.println("公众号");
            //创建一个弹窗对象
            JDialog jDialog = new JDialog();
            //创建一个管理图片的容器JLabel
            JLabel jLabel = new JLabel(new ImageIcon("puzzlegame\\image\\aboutLD.png"));
            //设置位置和长宽
            jLabel.setBounds(0,0,250,250);
            //把图片加载到弹框中
            jDialog.getContentPane().add(jLabel);
            //设置弹框的长宽
            jDialog.setSize(344,344);
            //弹框置顶
            jDialog.setAlwaysOnTop(true);
            //让弹框居中
            jDialog.setLocationRelativeTo(null);
            //弹框不关闭，无法操作下面的界面
            jDialog.setModal(true);
            //让弹框显示出来
            jDialog.setVisible(true);

        } else if (obj==rechargeItem1) {
            System.out.println("充值1");
            //调用弹窗界面展示充值1
            new RechargeDialog("puzzlegame\\image\\1元.png");
        } else if (obj==rechargeItem2) {
            System.out.println("充值2");
            //调用弹窗界面展示充值2
            new RechargeDialog("puzzlegame\\image\\6元.png");
        } else if (obj==rechargeItem3) {
            System.out.println("充值3");
            //调用弹窗界面展示充值3
            new RechargeDialog("puzzlegame\\image\\30元.png");
        } else if (obj==rechargeItem4) {
            System.out.println("充值4");
            //调用弹窗界面展示充值4
            new RechargeDialog("puzzlegame\\image\\98元.png");
        } else if (obj==rechargeItem5) {
            System.out.println("充值5");
            //调用弹窗界面展示充值5
            new RechargeDialog("puzzlegame\\image\\648元.png");
        } else if (obj==beautyItem) {
            Random r=new Random();
            int randomIndex=r.nextInt(13)+1;
            System.out.println("随机更换美女图片"+randomIndex);
            path="puzzlegame\\image\\girl\\girl"+randomIndex+"\\";
            initDate();
            step=0;
            initImage();
        } else if (obj==animalItem) {
            Random r=new Random();
            int randomIndex=r.nextInt(8)+1;
            System.out.println("随机更换动物图片"+randomIndex);
            path="puzzlegame\\image\\animal\\animal"+randomIndex+"\\";
            initDate();
            step=0;
            initImage();
        } else if (obj==sportItem) {
            Random r=new Random();
            int randomIndex=r.nextInt(10)+1;
            System.out.println("随机更换运动图片"+randomIndex);
            path="puzzlegame\\image\\sport\\sport"+randomIndex+"\\";
            initDate();
            step=0;
            initImage();
        }

    }
}
